Enum 的用法我想接觸過C# 的人都十分了解, 它能夠把變數的範圍限制在某些範圍並賦予其定義, 可讓程式碼更好維護之外更增加程式可讀性, 但是Javascript 才不鳥我們呢.
我們來看看Typescript 怎麼寫
enum MyColor {
   Red,
   Green,
   Blue
}
let color: MyColor = MyColor.Red;
console.log(color);
結果會輸出
1
你也可以依照數值, 取得對應的顏色名稱
var colorName = MyColor[2];
console.log(colorName);
雖然說Javascript 沒有內建的enum , 但我們還是來看看Typescript 是如何幫我們產生的
var MyColor;
(function (MyColor) {
    MyColor[MyColor["Red"] = 0] = "Red";
    MyColor[MyColor["Green"] = 1] = "Green";
    MyColor[MyColor["Blue"] = 2] = "Blue";
})(MyColor || (MyColor = {}))
在Typescript 中, 假設有兩個地方都宣告同一個interface 名稱, 例如
interface IPerson {
   walk(): void;
}
另一個地方宣告
interface IPerson {
   talk(): void;
}
編譯出來的IPerson 相當於
interface IPerson {
   walk(): void;
   talk(): void;
}
這對宣告Javascript global 很有用, 例如
在某個 xxx.ts 中
declare global {
   interface Array<T> {
      average(): number;
   }
}
Array.prototype.average = function () {
   return this.reduce(function (a, b) {
      if(typeof a !== "number" || typeof b !== "number"){
         throw new Error("average method applies only on numeric arrays.");
      }
      return a + b;
   }, 0) / this.length;
   return this;
}
當你引用這 ts 檔案,
let data: number[] = [1, 2, 3];
console.log(data.average());
Array 就會支援average 方法, 結果會算出平均值
然後又有另一個 ts 檔案擴充Array median() 中位數方法,
declare global {
   interface Array<T> {
      median(): number;
   }
}
這兩個 ts 就相當於
declare global {
   interface Array<T> {
      average(): number;
      median(): number;
   }
}
在Javascript 裡面常常會用到callback , 例如 setInterval() 方法
假設我們設計了一個api
function api(callback) {
   ....
   callback(data);
}
開發人員很難看出這個callback 是帶甚麼參數
Typescript 可以明確宣告這個callback
type MyCallback = (IPerson) => void;
function api(callback: MyCallback) {
   ...
   callback(data);
}
上述程式碼示範了 MyCallback 類型是一個回呼函式, 輸入參數類型是 IPerson, 回傳結果是 void .
Typescript 提供為型別取別名, 例如:
type MyScope = Bussiness.Utils.Scope;
type Callback = () => void;
Typescript 支援非同步方法
下面範例設計一個sleep 非同步方法
async function sleep(time : number): Promise<void> {
   return new Promise<void>((resolve,reject)=>{
      setTimeout(resolve,time);
   });
}
呼叫非同步方法的時候就可以這樣使用
async function main() {
   await sleep(2000);  //延遲兩秒
   console.log("Hello World!");
}